package d9_bs;

import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.*;

public class Server01 {
    //1、创建一个线程池
    public static ExecutorService pool = new ThreadPoolExecutor(
            3,
            5,
            6,
            TimeUnit.MINUTES,
            new ArrayBlockingQueue<>(3),
            Executors.defaultThreadFactory(),
            new ThreadPoolExecutor.CallerRunsPolicy());
    public static void main(String[] args) throws Exception {
        System.out.println("==服务端进行启动了==");
        //目标:实现简易版的BS架构-------->使用线程池进行优化
        //1、注册端口
        ServerSocket serverSocket = new ServerSocket(8848);

        while (true) {
            //2、开始等待客户端的Socket管道接通
            //上面是一个阻塞方法,它会等待客户端连接请求
            //当客户端连接到服务器时,accept()返回一个新的Socket对象,这个对象代表当前连接的客户端
            //因此-->Socket中封装了客户端的网路信息,包括:客户端的IP地址(Socket.getInetAddress())、客户端的端口号(socket.getPort())
            Socket socket = serverSocket.accept();

            //3、追踪每一个客户端,上线逻辑
            System.out.println(socket.getInetAddress().getHostAddress() + ":" +socket.getPort() + "上线了~~");

            //4、然后交给每一个线程进行处理
            //创建每一个子线程,键管道交给,子线程
           // pool.submit(new ServerReaderThread(socket));//高手写代码,会这样写

            //但是还是让类实现,Runnable接口
            pool.submit(new ServerReaderRunnable(socket));

            //Thread-->本身就是一个任务对象,如果往线程池里面方,就只会用线程池里面的线程
            //只是但任务对象看
        }

    }
}
